﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.ServiceModel.Diagnostics;
using IAOI.Platform.Common.Diagnostics;
namespace IAOI.Platform.Common.Configuration
{
    public class SettingsSection : ConfigurationSection
    {
       

        [ConfigurationProperty("PerformanceCounter")]
        public PerformanceCounter PerformanceCounter
        {
            get
            {
                return (PerformanceCounter)this["PerformanceCounter"];
            }
            set
            {
                this["PerformanceCounter"] = value;
            }
        }

        [ConfigurationProperty("Trace")]
        public Trace Trace
        {
            get
            {
                return (Trace)this["Trace"];
            }
            set
            {
                this["Trace"] = value;
            }
        }
        [ConfigurationProperty("MessageLogging")]
        public MessageLogging MessageLogging
        {
            get
            {
                return (MessageLogging)this["MessageLogging"];
            }
            set
            {
                this["MessageLogging"] = value;
            }
        }

        [ConfigurationProperty("EventLog")]
        public EventLog EventLog
        {
            get
            {
                return (EventLog)this["EventLog"];
            }
            set
            {
                this["EventLog"] = value;
            }
        }


        [ConfigurationProperty("DataBase", IsRequired = true)]
        public ConnectionStringSettings DataBase
        {
            get
            {
                return (ConnectionStringSettings)this["DataBase"];
            }
            set
            {
                this["DataBase"] = value;
            }
        }

    }

    public class PerformanceCounter : ConfigurationElement
    {
        [ConfigurationProperty("scope", DefaultValue = PerformanceCounterScope.Off)]
        public PerformanceCounterScope Scope
        {
            get
            {
                return (PerformanceCounterScope)this["Scope"];
            }
            set
            {
                this["Scope"] = value;
            }
        }
    }



    public class Trace : ConfigurationElement
    {
        [ConfigurationProperty("level", IsRequired = false, DefaultValue = TraceLevel.Off)]
        public TraceLevel Level
        {
            get
            {
                return (TraceLevel)this["Level"];
            }
            set
            {
                this["Level"] = value;
            }
        }

        [ConfigurationProperty("listenerType", IsRequired = false, DefaultValue = "IAOI.Platform.Common.Diagnostics.DefaultMessageListener, IAOI.Platform.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a99cb6361bc967af")]
        public String ListenerType
        {
            get
            {
                return (String)this["ListenerType"];
            }
            set
            {
                this["ListenerType"] = value;
            }
        }

        /// <summary>
        /// Trace로그를 서비스 진행단계전반에 걸처서 기록합니다. 
        /// flase일경우 서비스가 리턴되는 시점에 일괄기록합니다. 
        /// true일경우 입력받는 시점에 기록하과 중간과정에서 필요시 업테이트합니다.
        /// true는 장기 서비스 실행 시나리오에서 적합한 Trace방법입니다. 
        /// </summary>
        [ConfigurationProperty("activityMode", IsRequired = false, DefaultValue = false)]
        public bool ActivityMode
        {
            get
            {
                return (bool)this["ListenerType"];
            }
            set
            {
                this["ListenerType"] = value;
            }
        }



        [ConfigurationProperty("listenerSourceName", IsRequired = true, DefaultValue = "IAOIDB")]
        public String ListenerSourceName
        {
            get
            {
                return (String)this["ListenerSourceName"];
            }
            set
            {
                this["ListenerSourceName"] = value;
            }
        }

        /// <summary>
        /// Trace를 기록할 최소 서비스 처리 시간입니다. 
        /// 이설정값보다 실행 시간이 긴 서비스들만 Trace로그를 기록합니다. ActivityMode="true"일경우 이값은 무시됩니다.
        /// 기본값은 "-1"로 서비스 실행 시간과 관계없이 모든 로그를 기록합니다. 
        /// </summary>
        [ConfigurationProperty("durationInfimum ", IsRequired = true, DefaultValue = -1)]
        public long DurationInfimum
        {
            get
            {
                return (long)this["DurationInfimum"];
            }
            set
            {
                this["DurationInfimum"] = value;
            }
        }
    }

    public class MessageLogging : ConfigurationElement
    {
        [ConfigurationProperty("level", IsRequired = false, DefaultValue = TraceLevel.Off)]
        public TraceLevel Level
        {
            get
            {
                return (TraceLevel)this["Level"];
            }
            set
            {
                this["Level"] = value;
            }
        }


        /// <summary>
        /// Input Message를 기록할 최대 싸이즈(단위 byte)입니다. 
        /// 이설정값보다 큰 메시지는 메시지 내용을 기록하지 않습니다.
        /// 기본값은 "-1"로 크기와 상관없이 모든 메시지를 기록합니다. 
        /// </summary>
        [ConfigurationProperty("maxSizeOfInputMessageToLog", IsRequired = false, DefaultValue = -1)]
        public int MaxSizeOfInputMessageToLog
        {
            get
            {
                return (int)base["MaxSizeOfInputMessageToLog"];
            }
            set
            {
                base["MaxSizeOfInputMessageToLog"] = value;
            }
        }

        /// <summary>
        /// Output Message를 기록할 최대 싸이즈(단위 byte)입니다.
        /// 이설정값보다 큰 메시지는 메시지 내용을 기록하지 않습니다.
        /// 기본값은 "-1"로 크기와 상관없이 모든 메시지를 기록합니다. 
        /// </summary>
        [ConfigurationProperty("maxSizeOfOutputMessageToLog", IsRequired = false, DefaultValue = -1)]
        public int MaxSizeOfOutputMessageToLog
        {
            get
            {
                return (int)base["MaxSizeOfOutputMessageToLog"];
            }
            set
            {
                base["MaxSizeOfOutputMessageToLog"] = value;
            }
        }

        [ConfigurationProperty("listenerType", IsRequired = false, DefaultValue = "IAOI.Platform.Common.Diagnostics.DefaultMessageListener, IAOI.Platform.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a99cb6361bc967af")]
        public String ListenerType
        {
            get
            {
                return (String)this["ListenerType"];
            }
            set
            {
                this["ListenerType"] = value;
            }
        }


        /// <summary>
        /// Input Message를 기록할지 여부를 설정합니다.
        /// ture이면 MaxSizeOfInputMessageToLog에 설정한 값보다 작은 크기의 메시지일경우 기록합니다. 
        /// </summary>
        [ConfigurationProperty("inputMessageToLog", IsRequired = true, DefaultValue = false)]
        public Boolean InputMessageToLog
        {
            get
            {
                return (Boolean)this["InputMessageToLog"];
            }
            set
            {
                this["InputMessageToLog"] = value;
            }
        }

     

        [ConfigurationProperty("outputMessageToLog", IsRequired = true, DefaultValue = false)]
        public Boolean OutputMessageToLog
        {
            get
            {
                return (Boolean)this["OutputMessageToLog"];
            }
            set
            {
                this["OutputMessageToLog"] = value;
            }
        }

        [ConfigurationProperty("listenerSourceName", IsRequired = true, DefaultValue = "IAOIDB")]
        public String ListenerSourceName
        {
            get
            {
                return (String)this["listenerSourceName"];
            }
            set
            {
                this["listenerSourceName"] = value;
            }
        }

        [ConfigurationProperty("durationInfimum ", IsRequired = true, DefaultValue = -1)]
        public long DurationInfimum
        {
            get
            {
                return (long)this["DurationInfimum"];
            }
            set
            {
                this["DurationInfimum"] = value;
            }
        }

    }



    public class EventLog : ConfigurationElement
    {
        [ConfigurationProperty("businessSourceName", IsRequired = false, DefaultValue = "IAOI Business")]
        public String BusinessSourceName
        {
            get
            {
                return (String)this["BusinessSourceName"];
            }
            set
            {
                this["BusinessSourceName"] = value;
            }
        }

        [ConfigurationProperty("platformSourceName", IsRequired = false, DefaultValue = "IAOI Platform")]
        public String PlatformSourceName
        {
            get
            {
                return (String)this["PlatformSourceName"];
            }
            set
            {
                this["PlatformSourceName"] = value;
            }
        }

        [ConfigurationProperty("defaultSourceName", IsRequired = false, DefaultValue = "IAOI")]
        public String DefaultSourceName
        {
            get
            {
                return (String)this["DefaultSourceName"];
            }
            set
            {
                this["DefaultSourceName"] = value;
            }
        }
    }









    //[ConfigurationProperty("connectionStringName", IsRequired = true, DefaultValue="LOGDB")]
    //public string connectionStringName
    //{
    //    get
    //    {
    //        return (string)base["connectionStringName"];
    //    }
    //    set
    //    {
    //        base["connectionStringName"] = value;
    //    }
    //}
}
